#include "InetAddress.hpp"

namespace xww
{
    InetAddress::InetAddress(unsigned short port,const string &ip)
    {
        //通过数据成员_addr初始化InetAddress对象
        memset(&_addr, 0, sizeof(_addr)); // 初始化_addr为0
        _addr.sin_family = AF_INET; // 设置地址族为IPv4
        _addr.sin_port = htons(port); // 设置端口号，使用htons将主机字节序转换为网络字节序
        _addr.sin_addr.s_addr = inet_addr(ip.c_str()); // 将IP地址字符串转换为网络字节序的地址
    }

    InetAddress::InetAddress(const struct sockaddr_in& addr)
        : _addr(addr) // 使用初始化列表将sockaddr_in结构体赋值给_addr
    {

    }

    string InetAddress::getIp() const
    {
        // 将网络字节序的IP地址转换为字符串形式
        return inet_ntoa(_addr.sin_addr);
    }

    unsigned short InetAddress::getPort() const
    {
        return ntohs(_addr.sin_port);
    }

    // 这里为什么不能加const？
    // 因为getInetAddrPtr需要返回一个指向sockaddr_in的指针，
    // 如果加上const，那么返回的指针将无法修改_addr的内容，
    // 这可能会导致无法正确设置或修改IP地址和端口。
    struct sockaddr_in *InetAddress::getInetAddrPtr() 
    {
        return &_addr;
    }

}